Looping through skiplist that has both object and module attributes

I have a script that I modified to include module in addition to object attributes in a single skiplist.  Now, I am looping through the objects in a module and want to check the values of the object attributes.  Is there an easy way to distinguish whether the attribute in the skip list is an object attribute?  Right now, when I loop through the list, I, of course, get an error when the loop gets to a module-level attribute.  I want to check and make sure that the attribute is an object-level one.  Here is the code I currently have with the addition:

AttrDef ad;
Skip skAttrs = createString;
Module currMod = current Module;

for itemRef in current Project do {
    //First, loop thru all attributes and module amd store
    //them if they are object or module attributes
    for ad in currMod do {
        if (ad.object || ad.module) {       //Added "|| ad.module"
            //Preset the number of times this attribute is used to zero
            attribName = ad.name"";
            //If this is a custome attribute
            if (findPlainText(attribName, "*", offset, lenth, true)) {
                put(skAttrs, attribName, 0);
            }
        }
    }
    //Next step is to loop through the objects in the module and
    //see if it has a value.  If it does, increment its value in the skip list
    for obj in currMod do {
        for o in skAttrs do {
            attribName = (string key skAttrs);
            if (obj.attribName"" != "") {
                //Increment the value
                if (find(skAttrs, attribName, numAttr)) {
                    delete(skAttrs, attribName);
                    numAttr++;
                    bAttribNumFound = put(skAttrs, attribName, numAttr);
                    find(skAttrs, attribName, numAttr);
                }
            }
        }
    }
    close(currMod);
}

The error I get is "unknown Object attribute (*Contract Number)" , where *Contract Number is a module-level attribute, on the line 

  if (obj.attribName"" != "")

The thing is that I understand why the error is appearing.  I just don't know how to check if that attribName string is an object-level attribute.

 

Chris


Christopher Cote - Wed Jun 12 10:02:27 EDT 2019

Re: Looping through skiplist that has both object and module attributes
Mike.Scharnow - Wed Jun 12 12:04:11 EDT 2019

Well, you COULD ask DOORS about this attribute like this

after line 22:
AttrDef ad = find (currMod, attribName)
if (!null ad and ad.object) {
    // is object AttrDef
    if (obj.attribName"" != "") { ....
}

but this would mean that you would do such a find command for EVERY Object for EVERY attr. I assume that this will slow down your script significantly.

You should restructure your data model, perhaps use two skips, one for object and one for module attributes.

Re: Looping through skiplist that has both object and module attributes
llandale - Mon Aug 19 18:09:03 EDT 2019

I would put the AttrDef handle "ad" as the Data in the Skip list.  Then loop through that.
for ad in skAttrs dp

{  if (ad.object) ...

}